package com.example.nplboot.baidu;

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import okhttp3.*;
import org.json.JSONObject;

import com.example.nplboot.model.YBGTextInfoVo;
import com.example.nplboot.model.baidu.Results;
import com.example.nplboot.model.baidu.Results_list;
import com.example.nplboot.model.baidu.Returnjson;
import com.example.nplboot.model.baidu.postjson.BdPostJson;
import com.example.nplboot.model.baidu.postjson.Content_list;
import com.example.nplboot.model.baidu.postjson.Query_list;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Classname BDUtil
 * @Date 2023/4/8 14:00
 * @Created by 87766867@qq.com
 * https://console.bce.baidu.com/tools/?_=1680944282651#/api?product=AI&project=%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86&parent=%E8%AF%AD%E8%A8%80%E7%90%86%E8%A7%A3&api=rpc%2F2.0%2Fnlp%2Fv1%2Ftxt_monet&method=post
 * 
 * content_list	array	是	输入的文本列表，支持不超过16段的文本进行批量提取
+content	string	是	输入文本，每段文本不超过450个字
+query_list	array	是	用户自定义的短语（或问题）列表，每段文本的短语（或问题）数量不超过10个
++query	string	是	用户自定义的短语（或问题）
 * 
 */
public class BDUtil {
    public static final String API_KEY = "uNQ36wONLkhImBegVZNGIC9s";
    public static final String SECRET_KEY = "Bii307gcezZcLyhLrWalE7PFMIE6GyfE";

   static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();

    public static String sendText(String text) throws IOException{
    	
    	
        MediaType mediaType = MediaType.parse("text/plain");
        RequestBody body = RequestBody.create(mediaType, text);
        Request request = new Request.Builder()
                .url("https://aip.baidubce.com/rpc/2.0/nlp/v1/txt_monet?access_token=" + getAccessToken())
                .method("POST", body)
                .build();
        Response response = HTTP_CLIENT.newCall(request).execute();
        String str=response.body().string();
        System.out.println("百度返回:"+str);
        return  str;
    }
    
    /**
     * 判断是否是单位
     * @param str
     * @return
     */
    public static boolean ifdw(List<String> strlist) {
    	for (String string : strlist) {
    		String dw="政府、部、委、办、署、司、厅、局、处、科、中心、馆、所、站、台、社、院、校、队、团、室、法院、检察院、组织部、宣传部、战部、人大、常委会、办公厅、委员会、外交部、财政部、改委、厅、局、区、办公厅、政治部、立案庭、检察厅、研究室、办公室、机关、电视台、医院、中国、科技";
    		boolean containsAdminDivision = string.matches(".*省.*|.*市.*|.*自治区.*|.*特别行政区.*|.*县.*|.*区.*|.*旗.*|.*州.*|.*盟.*.*家园.*");
    		System.out.println(hasCommonChars(string, dw));
    		if(string.length()>5&&hasCommonChars(string, dw)&&!containsAdminDivision){
    			
    			return true;
    		}
		}
    	

		return false;
	}
    
    /**
     * 回车字符分组
     * @param text
     * @return
     */
    public static List<String> enterList(String text){
    	List<String> textList=new ArrayList<String>();
    	
    	String[] groups = text.split("\\s*\\n\\s*");
    	for(String group : groups) {
    		textList.add(group);
    	}
    	
    	return textList;
    }
    
    /**
     * 特殊字符分组
     * @param text
     * @return
     */
    public static List<String> chartList(String text){
    	List<String> textList=new ArrayList<String>();
    	
    	String[] groups = text.split("[\\u00A0\\s\"`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“’。，、？]");
    	for(String group : groups) {
    		textList.add(group);
    	}
    	
    	return textList;
    }
    
    /**
     * 判断原被告分组
     * @param text
     * @return
     */
    public static Map<String,List<String>> isybg(String text){
    	Map<String,List<String>> textList=new HashMap<String, List<String>>();
    	
    	List<String> ygList=new ArrayList<String>();
    	List<String> bgList=new ArrayList<String>();
    	
    	//原告
    	
    	String regex = "(?<=原告).*?(?=被告)";
    	Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
    	Matcher matcher = pattern.matcher(text);
    	if (matcher.find()) {
    	    String result = matcher.group();
    	    ygList.add(result);
    	}
    	String[] bggroups = text.split("被告");
    	
    	//被告
    	for (int i = 1; i < bggroups.length; i++) {
    		bgList.add(bggroups[i]);
		}
    	textList.put("原告", ygList);
    	textList.put("被告", bgList);
    	return textList;
    }
    
    
    //判断字符是否在字符串里面
    public static boolean hasCommonChars(String str1, String dw) {
    	String[] strlist=dw.split("、");
    	for (String string : strlist) {
    		if (str1.indexOf(string) != -1) {
	            return true;
	        }
		}
	    return false;
	}
    
    /**
     * 提取好的原告被告信息
     * @param text 内容
     * @return
     */
    public static List<YBGTextInfoVo> ygbgStrList(String text){
    	List<YBGTextInfoVo> infoVos=new ArrayList<YBGTextInfoVo>();
    	//回车分组
    	List<String> list=enterList(text);
    	for (String string : list) {
			System.out.println(string);
		}
    	
    	//原告被告分组
    	Map<String,List<String>> ybg=isybg(text);
    	
    	//原告数量
    	List<String> yg_oldList=ybg.get("原告");
    	//被告数量
    	List<String> bg_oldList=ybg.get("被告");
    	
    	for (String string : yg_oldList) {
    		//特殊字符分组
        	List<String> ygList= chartList(string);
        	
        	YBGTextInfoVo yginfoVo=new YBGTextInfoVo();
        	//是否包含行政单位
        	yginfoVo.setIsbhxzdw(ifdw(ygList));
        	yginfoVo.setYbgtype(1);
        	yginfoVo.setTextList(ygList);
        	yginfoVo.setText(string);
        	infoVos.add(yginfoVo);
        	
        	
		}
    	
    	for (String string : bg_oldList) {
			
    		List<String> bgList= chartList(string);
    		YBGTextInfoVo byginfoVo=new YBGTextInfoVo();
        	
        	byginfoVo.setIsbhxzdw(ifdw(bgList));
        	byginfoVo.setYbgtype(2);
        	byginfoVo.setTextList(bgList);
        	byginfoVo.setText(string);
        	infoVos.add(byginfoVo);
		}
    	
    	
    	
    	
    	
    	
		return infoVos;
    }
    

    public static void main(String[] args) {
    	String text = "原告s李爽,男,汉族,1997年5月I日生户籍地四川省华\n" +
                "莹市禄市镇小驴山村3组142号身份证号码513601199705012275】\n" +
                "电话15983456738,代理人电话18983297322。\n" +
                "\n" +
                "被告一:重庆天安生物科技有限公司,统一社会信用代码:";
			  String regex = "(?<=原告).*?(?=被告)";
			  Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
			  Matcher matcher = pattern.matcher(text);
			  if (matcher.find()) {
			      String result = matcher.group();
			      // use the result string as needed
			      System.out.println(result);
			  }
    }

    //创建模板 提问list
    public static List<Query_list> createQuery_MubanList(Boolean isbhxzdw){
    	List<Query_list> queryLists=new ArrayList<Query_list>();
    	
        if(isbhxzdw){//企业
        	Query_list queryList1=new Query_list("企业名");
        	Query_list queryList2=new Query_list("企业地址");
        	Query_list queryList3=new Query_list("法定代表人");
        	Query_list queryList4=new Query_list("电话号码");
        	Query_list queryList5=new Query_list("统一社会信用代码");
        	queryLists.add(queryList1);
        	queryLists.add(queryList2);
        	queryLists.add(queryList3);
        	queryLists.add(queryList4);
        	queryLists.add(queryList5);
        }else{//正常人
        	
        	Query_list queryList1=new Query_list("名字");
        	Query_list queryList2=new Query_list("性别");
        	Query_list queryList3=new Query_list("民族");
        	Query_list queryList4=new Query_list("地址");
        	Query_list queryList5=new Query_list("电话号码");
        	Query_list queryList6=new Query_list("身份证号码");
        	queryLists.add(queryList1);
        	queryLists.add(queryList2);
        	queryLists.add(queryList3);
        	queryLists.add(queryList4);
        	queryLists.add(queryList5);
        	queryLists.add(queryList6);
        	
        }
        return queryLists;
    }
    

    //创建模板json
    public static BdPostJson createMubanJson(String text){
    	List<YBGTextInfoVo> ybgTextInfoVos=ygbgStrList(text);
    	
    	
    	
    	BdPostJson bdPostJson=new BdPostJson();
    	List<Content_list> content_lists=new ArrayList<Content_list>();
    	
     	for (YBGTextInfoVo ybgTextInfoVo : ybgTextInfoVos) {
     		
     		
     		Content_list content_list=new Content_list();
     		
     		//设置内容
     		content_list.setContent(ybgTextInfoVo.getText());
     		
     		//设置问题
     		
     		content_list.setQuery_list(createQuery_MubanList(ybgTextInfoVo.getIsbhxzdw()));
     		
     		
     		content_lists.add(content_list);
 		}
     	bdPostJson.setContent_list(content_lists);;
         
         
     	System.err.println(JSONUtil.toJsonPrettyStr(bdPostJson));
         
      
        return bdPostJson;
    }
    
    public void jsonJx(String strjson){
    	if(strjson.indexOf("error_code")!=-1){
    		Returnjson returnjson=JSONUtil.toBean(strjson,Returnjson.class);
    		Results_list results_list=returnjson.getResults_list().get(0);
    		List<Results> results= results_list.getResults();
    		
    		 results.get(0).getItems().get(0).getText();
    		
    	}
    }


    /**
     * 从用户的AK，SK生成鉴权签名（Access Token）
     *
     * @return 鉴权签名（Access Token）
     * @throws IOException IO异常
     */
    public static String getAccessToken() throws IOException {
        MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
        RequestBody body = RequestBody.create(mediaType, "grant_type=client_credentials&client_id=" + API_KEY
                + "&client_secret=" + SECRET_KEY);
        Request request = new Request.Builder()
                .url("https://aip.baidubce.com/oauth/2.0/token")
                .method("POST", body)
                .addHeader("Content-Type", "application/x-www-form-urlencoded")
                .build();
        Response response = HTTP_CLIENT.newCall(request).execute();
        return new JSONObject(response.body().string()).getString("access_token");
    }
}
